/*
 * 
 * 
 * @author Alexander Sibiryakov, 24-04-2008
 */

function SortableManager() {
	this.current_state = '';
	
	// private
	this.last_sortable_group = null;
	
	this.addGroup = function(dom_elt) {
		// используется когда добавилась новая группа и ее нужно сделать сортируемой
			
		switch (this.current_state){
			case 'community':
			jQuery(dom_elt).Sortable({
				accept:      'community',
				activeclass: 'wg-droppable-active',
				hoverclass:  'wg-droppable-hover',
				helperclass: 'wg-droppable-help',
				opacity:     0.5,
				ghosting:    true,
				tolerance:   'pointer',
				onStart:     function() { 
					// здесь this это draggable элемент
				},
				onStop:      function() { 
					$(this).removeAttr('style').css('cursor', 'move');
					//_onDragEnd(this); // а тут уже droppable элемент куда упало
				 }
			});
			break;
			case 'group':
			jQuery('.groupcontainer').SortableAddItem(dom_elt);
			break;
		}
		
	}
	
	this.setupGroupSortable = function() {
		if (this.current_state=='community') {
			$('.group').SortableDestroy();
		}
			
		$('.group').css('cursor', 'move');
		$('.groupcontainer').Sortable({
			accept:      'group',
			activeclass: 'wg-droppable-active',
			hoverclass:  'wg-droppable-hover',
			helperclass: 'wg-droppable-help',
			opacity:     0.5,
			ghosting:    true,
			tolerance:   'pointer',
			onStart:     function() { 
				},
			onStop:      function() { 
				$(this).removeAttr('style').css('cursor', 'move');
				gm.updateLayout();
			 }
		});
		this.current_state = 'group';
	}
	
	this.setupCommunitySortable = function() {
		if (this.current_state=='group') {
			$('.groupcontainer').SortableDestroy();
		}

		$('.community').css('cursor', 'move');
		$('.group').Sortable({
			accept:      'community',
			activeclass: 'wg-droppable-active',
			hoverclass:  'wg-droppable-hover',
			helperclass: 'wg-droppable-help',
			opacity:     0.5,
			ghosting:    true,
			tolerance:   'pointer',
			onStart:     function() { 
				var grp_id = jQuery(this).parent().attr("id");
				var grp = gm.getGroup(grp_id);
								
				if (grp) {
					this.last_sortable_group = grp;
				} else {
					this.last_sortable_group = null;
				}
			},
			onStop:      function() { 
				$(this).removeAttr('style').css('cursor', 'move');
				
				
				var grp_id = jQuery(this).parent().attr("id");
				var new_grp = gm.getGroup(grp_id);
				
				if (this.last_sortable_group == new_grp) {
					// сообщество в той же группе оказывается
					// просто обновить в этой группе расстановку
									
					if (new_grp) new_grp.updateLayout();
				} else {
					// сообщество перетащили в другую группу
					// обновим расстановку в обоих группах
					if (new_grp) {
						new_grp.updateLayout();
					}
										
					if (this.last_sortable_group) {
						this.last_sortable_group.updateLayout();
					}
					
				}
				
				this.last_sortable_group = null;
			 }
		});
		this.current_state = 'community';
	}
}

function Group(dom_elt, gen_grp) {
	this.dom_elt = dom_elt;
	this.id = jQuery(dom_elt).attr("id");
	this.g_group_link = gen_grp;
	this.name = "";
		
	this.updateLayout = function() {
		// обновляет расстановку сообществ внутри группы на сервере
		
		var layout = new Array();
		jQuery(this.dom_elt).find(".community").each(function() {
			var id = jQuery(this).attr("id").substr(1) * 1;
			layout.push(id);
		});
		
		cp.call(ajax_url, 'ajax_upCommunityGroupLayout', function(result) {}, this.getOid(), layout);
	}
	
	this.getOid = function() {
		var pref = new String(Group.prefix);
		var id = this.id.substr(pref.length) * 1;
		return id;
	}
	
	this.rmGroup = function() {
		// обновить общую группу
		var g_group = this.g_group_link;
		
		jQuery("#"+this.id+" div.community").each(function() {
			g_group.addCommunity(this);
		});
		
		// послать аякс запрос
		cp.call(ajax_url, 'ajax_rmGroup', function(result) {}, this.getOid());
		
		// а здесь нужно удалить ссылку на этот объект если она еще где то есть
		
		// удалить сам объект
		jQuery(this.dom_elt).remove();
	}
	
	this.setName = function(name) {
		this.name = name;
		cp.call(ajax_url, 'ajax_setGroupName', function(result) {}, this.getOid(), name);
		//console.log("name setted.");
	}
	
	// повесим обработчик на кнопку "удалить"
	var del_elt = jQuery("#"+this.id+" li.delete- a");
	var group_obj = this;
	jQuery(del_elt).click(function (event){
		event.preventDefault();
		group_obj.rmGroup();
	});
	
	// повесим редактор на заголовок группы
	jQuery("#"+this.id+" h1").editable(function(value, settings) { 
		group_obj.setName(value);
		return(value);
	}, { 
		type    : "textarea",
		submit  : "OK",
	});
}
Group.prefix = "group_";


function GeneralGroup(dom_elt) {
	this.dom_elt = dom_elt;
	this.id = jQuery(dom_elt).attr("id");
	
	this.addCommunity = function (dom_elt) {
		jQuery(this.dom_elt).append(dom_elt);
	}
}

function GroupCreator(container_dom_elt) {
	this.dom_container = container_dom_elt;
	this.group_html = '<div class="group wg-droppable" style="padding: 5px; border: 2px dashed #CCCCCC"><ul class="actionspanel-"><li class="delete-"><a href="#">Удалить</a></li></ul><h1>Новая группа</h1><p>empty</p></div>';
    
	
	this.createNew = function(gen_group) {
		// рассчитать новый индекс: найдем наибольший и увеличим на единицу
		var new_index = 0;
		var pref = new String(Group.prefix);
		
		jQuery(".group:not(#group_general)").each(function() {
			//var id = jQuery(this).attr("id").substr(pref.length); // откусим от строки префикс
			var grp = gm.getGroup(jQuery(this).attr("id"));
			var id = grp.getOid(this);
			if (new_index < (id*1)) new_index = id;
		});
		
		new_index++;
				
		// вставить хтмл с этим индексом
		jQuery(this.dom_container).prepend(this.group_html);
		var grps = jQuery("div.group");
		var new_elt_dom = grps[0];
		jQuery(new_elt_dom).attr("id", Group.prefix+new_index);
		
		// послать аякс запрос о том, что появился новый индекс
		cp.call(ajax_url, 'ajax_addGroup', function(result) {}, new_index, "Новая группа");
		
		// создаем объект и добавляем в менеджер групп
		var grp = new Group(new_elt_dom, gen_group);
		gm.addGroup(grp);
	}
	
}

function GroupManager() {
	this.groups = {};
	
	this.getGroup = function(oid) {
		return this.groups[oid];
	}
	
	this.addGroup = function (grp) {
		this.groups[grp.id] = grp;
	}
	
	this.updateLayout = function () {
		var layout = new Array();
		var obj = this;
		jQuery(".groupcontainer").find(".group").each(function() {
			var id = jQuery(this).attr("id");
			var grp = obj.getGroup(id);
			if (grp) layout.push(grp.getOid());
		});
		cp.call(ajax_url, 'ajax_upGroupLayout', function(result) {}, layout);

	}
}


$(document).ready(function (){
	gm = new GroupManager(); // переменная в глобальной области

	var gen_group = new GeneralGroup(jQuery("#group_general"));
	jQuery(".group:not(#group_general)").each(function (){
		var grp = new Group(this, gen_group);
		gm.addGroup(grp);
		});

	var sm = new SortableManager();
	
	$("#switch-sortable").click(function (){
			switch (sm.current_state) {
			case 'community':
				sm.setupGroupSortable();
			break;
			
			case 'group':
			default:
				sm.setupCommunitySortable();
			break;
		
		}
	});
	
	jQuery("#create_group").click(function() {
		
		var grp = new GroupCreator(jQuery(".groupcontainer")[0]);
		var new_grp = grp.createNew(gen_group);
		sm.addGroup(new_grp);
		
	});
	
	ajax_url = jQuery("#js_ajaxurl").attr("href");
	cp = new cpaint();
});


